package com.youpai.platform.common.util;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

public class Helper {

	//获取当前时间
	public static Timestamp getNow() {
		return new Timestamp(System.currentTimeMillis());
	}

	/**
	 * 编码 ID，不让用户知道数据库中的真实 ID
	 * <p>
	 * 理论上编码同一个 ID 时应该用该 ID 所在实例的 gmtCreated，但目前的编码/解码方式跟 gmtCreated 没啥关系， 不同的
	 * gmtCreated 可以解码成同一个 ID，所以可以用不同 gmtCreated 来编码 但 type 一定要一致
	 *
	 * @param time，时间，用于编码
	 * @param id，原始ID
	 * @param type，该ID对应实例的类型
	 * @return
	 */
	public static Long encodeId(Timestamp time, Long id, Integer type) {
		if (id == null) {
			return null;
		}
		if (time == null) {
			time = new Timestamp(System.currentTimeMillis());
		}
		if (id <= 0L) {
			return id;
		}
		return id * type * 1000000 + StringUtils.parseLong(
				StringUtils.timeToString(time, StringUtils.FULL_MILL_SECONDS_FORMAT)) % 999999;
	}

	/**
	 * 解码 ID，从用户看到的 ID 转成数据库中的真实 ID
	 *
	 * @param id，伪ID
	 * @param type，该ID对应实例的类型
	 * @return
	 */
	public static Long decodeId(Long id, Integer type) {
		if (id == null) {
			return null;
		}
		if (id <= 0) {
			return id;
		}
		id /= 1000000;
		if (id % type > 0) {
			return null;
		}
		return id / type;
	}

	/**
	 * 解码 ID列表，从用户看到的 ID 转成数据库中的真实 ID
	 *
	 * @param ids，伪ID列表
	 * @param type，该ID对应实例的类型
	 * @return List<Long> 真ID列表
	 */
	public static List<Long> decodeIds(List<Long> ids, Integer type) {
		if (ids == null) {
			return null;
		}
		List<Long> copy = new ArrayList<>();
		for (Long id : ids) {
			Long decodeId = Helper.decodeId(id, type);
			copy.add(decodeId);
		}
		return copy;
	}

	/**
	 * 编码 ID列表，从数据库中的真实 ID 转成用户看到的 ID
	 *
	 * @param ids，ID列表
	 * @param type，该ID对应实例的类型
	 * @return List<Long> 真ID列表
	 */
	public static List<Long> encodeIds(Timestamp timestamp, List<Long> ids, Integer type) {
		if (ids == null) {
			return null;
		}
		List<Long> copy = new ArrayList<>();
		for (Long id : ids) {
			Long decodeId = Helper.encodeId(timestamp, id, type);
			copy.add(decodeId);
		}
		return copy;
	}

}